package org.example;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        // 第一道题
        getN(6);
        int[] array = {1, -1, 3, 2, 0, 44, 3, 2, 1, 5, 3, 7, 2,1,1};
        // 第二道 题,如果 数据存在 重复性默认取最近的下表
        int index = getIndex(array);
        System.out.println("第 二项 结果" + (index+1));
    }


    // ！！！ 可以根据需要添加另外的函数与变量

    // 数列前2项为 1 1，从第3项开始，若为奇数项，则值为前两项之和，若为偶数项，则值为前两项之和的2倍
    // 可知该数列前6项为 1 1 2 6 8 28
    // 求该数列的第n项
    // 请用递归和循环两种方式实现
    public static long getN(int n) {
        // for循环
        getForeach(n);
        getDG(n);
        System.out.println("1结果" + getForeach(n));
        System.out.println("2结果" + getDG(n));

        return getForeach(n);

    }

    /**
     * 循环
     *
     * @param n 默认 n 大于0 不去做校验
     * @return
     */
    public static long getForeach(int n) {
        List<Long> resultList = new ArrayList<>(n);
        for (int i = 1; i <= n; i++) {
            if (i == 1 || i == 2) {
                resultList.add(getIndexValue(i));
            } else {
                //若为奇数项，则值为前两项之和，若为偶数项，则值为前两项之和的2倍
                // i 是从 1开始
                Long last2 = resultList.get(i - 3);
                Long last1 = resultList.get(i - 2);
                Long sumLast = last2 + last1;
                //奇数
                if (i % 2 == 1) {
                    resultList.add(sumLast);
                } else {
                    resultList.add(2 * sumLast);
                }
            }

        }
        return resultList.get(n - 1);
    }

    /***
     *  递归
     * @param n 默认 n 大于0 不去做校验
     * @return
     */
    public static long getDG(int n) {
        if (n == 1 || n == 2) {
            return getIndexValue(n);
        } else {
            if (n % 2 == 1) {
                return getDG(n - 2) + getDG(n - 1);
            } else {
                return 2 * (getDG(n - 2) + getDG(n - 1));
            }
        }
    }

    /**
     * 获取初始数据
     *
     * @param indexNum
     * @return
     */
    public static long getIndexValue(int indexNum) {
        long[] resutArray = {1, 1};

        return resutArray[indexNum - 1];
    }

    // 给定一个int型数组，找出其中大于0的数字中倒数第二小的数字的下标
    // 例如 1 -1 3 2 0，其中大于0的数字有1 3 2，倒数第二小的数字为2，其下标为3
    // 不能使用排序
    // 尽量只使用一次循环
    public static int getIndex(int[] array) {
        int[] arrayMaxMinList = {Integer.MAX_VALUE, Integer.MAX_VALUE};
        int compareIndex = 0;
        for (int i = 0; i < array.length; i++) {
            int arrayNum = array[i];
            if (arrayNum > 0) {
                if (arrayNum < arrayMaxMinList[0]) {
                    arrayMaxMinList[1] = arrayMaxMinList[0];
                    arrayMaxMinList[0] = arrayNum;
                } else if (arrayMaxMinList[1] >= arrayNum) {
                    arrayMaxMinList[1] = arrayNum;
                    compareIndex = i;
                } else {
                    continue;
                }
            } else {
                continue;
            }

        }

        return compareIndex;
    }
}